package dialog;

import bean.Kreditgeber;
import bean.Kunde;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

public class Main {

    private List<Kunde> kunden = new ArrayList<>();
    private EinUndAusgabe io = new EinUndAusgabe();
    private ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    //TODO

    public void dialog() {
        int eingabe = -1;
        while (eingabe != 0) {
            System.out.println("Was wollen Sie\n"
                    + " (0) Programm beenden\n"
                    + " (1) Kunden ergänzen");
            if (kunden.size() > 0) {
                System.out.println(" (2) Kredit für Kunden ergänzen");
            }
            System.out.println(" (3) Gesamtübersicht");
            eingabe = io.leseInteger();
            switch (eingabe) {
                case 1:
                    kundeErgaenzen();
                    break;
                case 2:
                    if (kunden.size() > 0) {
                        kreditFuerKundeErgaenzen();
                    }
                    break;
                case 3:
                    uebersicht();
                    break;
            }
        }
    }

    public void kundeErgaenzen() {
        Kunde k = new Kunde();
        boolean ok = false;
        Validator validator = factory.getValidator();
        while (!ok) {
            System.out.print("Name: ");
            // TODO
            String name = io.leseString();
            k.setName(name);
            Set<ConstraintViolation<Kunde>> cv = validator.validateProperty(k, "name");
            
            if(cv.isEmpty()) {
                ok = true;
            } else {
                for(ConstraintViolation<Kunde> c : cv) {
                    System.out.println(c.getMessage());
                }
            }
            
            //ENDE TODO
        }

        ok = false;
        while (!ok) {
            System.out.print("Kreditrahmen: ");
            // TODO
            String kreditrahmen = io.leseString();
            if(!kreditrahmen.equals("")) {
                k.setMaxKredit(BigInteger.valueOf(Long.parseLong(kreditrahmen)));
                Set<ConstraintViolation<Kunde>> cv = validator.validateProperty(k, "maxKredit");

                if(cv.isEmpty()) {
                    ok = true;
                } else {
                    for(ConstraintViolation<Kunde> c : cv) {
                        System.out.println(c.getMessage());
                    }
                }
            } else {
                System.out.println("Keine korrekte Eingabe");
            }
            
            //ENDE TODO
        }
        kunden.add(k);
    }

    private Kunde kundeWaehlen() {
        for (int i = 0; i < kunden.size(); i++) {
            // TODO
            Kunde k = kunden.get(i);
            System.out.println("[" + (i + 1) + "] " + k.getName());
            //TODO ENDE
        }
        int eingabe = -1;
        while (eingabe < 1 || eingabe > kunden.size()) {
            System.out.print("Welcher Kunde: ");
            eingabe = io.leseInteger();
        }
        return kunden.get(eingabe - 1);
    }

    private void kreditFuerKundeErgaenzen() {
        Kunde k = kundeWaehlen();
        Kreditgeber kg = new Kreditgeber();
        Validator validator = factory.getValidator();
        boolean ok = false;
        while (!ok) {
            System.out.print("Name Kreditgeber: ");
            //TODO
            String kreditgeberName = io.leseString();
            kg.setName(kreditgeberName);
            Set<ConstraintViolation<Kreditgeber>> cv = validator.validateProperty(kg, "name");
            
            if(cv.isEmpty()) {
                ok = true;
            } else {
                for(ConstraintViolation<Kreditgeber> c : cv) {
                    System.out.println(c.getMessage());
                }
            }
            //TODO ENDE
        }

        ok = false;
        while (!ok) {
            System.out.print("Kreditsumme: ");
            //TODO
            String kreditsumme = io.leseString();
            kg.setSumme(BigInteger.valueOf(Long.valueOf(kreditsumme)));
            Set<ConstraintViolation<Kreditgeber>> cv = validator.validateProperty(kg, "summe");
            if(cv.isEmpty()) {
                ok = true;
            } else {
                for(ConstraintViolation<Kreditgeber> c : cv) {
                    System.out.println(c.getMessage());
                }
            }
            //TODO ENDE
        }
        
        //TODO
        k.addKredit(kg);
        Set<ConstraintViolation<Kunde>> cv2 = validator.validateProperty(k, "kredite");
        if(!cv2.isEmpty()) {
            for(ConstraintViolation<Kunde> c : cv2) {
                System.out.println(c.getMessage());
                System.out.println("Kreditvergabe abgelehnt");
                return;
            }
        }
        Set<ConstraintViolation<Kunde>> cv3 = validator.validate(k);
        if(!cv3.isEmpty()) {
            for(ConstraintViolation<Kunde> c : cv3) {
                System.out.println(c.getMessage());
                System.out.println("Kreditvergabe abgelehnt");
                return;
            }
        }
        //TODO ENDE
    }

    private void uebersicht() {
        for (Kunde k : kunden) {
            System.out.print(k);
        }
    }

    public static void main(String[] args) {
        new Main().dialog();
    }
}
